/*******************************************************************************
* Copyright (c) 2012, Nabeel Shaheen
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted
******************************************************************************/
package com.odb.view.dashboard.client.charts;
import java.util.ArrayList;
import java.util.Date;
import java.util.Set;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.odb.view.dashboard.client.DataVO;
import com.odb.view.dashboard.client.DebugWindow;
import com.odb.view.dashboard.client.TimeSeriesDataVO;
import com.sencha.gxt.chart.client.chart.Chart;
import com.sencha.gxt.chart.client.chart.Chart.Position;
import com.sencha.gxt.chart.client.chart.Legend;
import com.sencha.gxt.chart.client.chart.axis.NumericAxis;
import com.sencha.gxt.chart.client.chart.axis.TimeAxis;
import com.sencha.gxt.chart.client.chart.series.BarSeries;
import com.sencha.gxt.chart.client.chart.series.Primitives;
import com.sencha.gxt.chart.client.draw.Color;
import com.sencha.gxt.chart.client.draw.RGB;
import com.sencha.gxt.chart.client.draw.path.PathSprite;
import com.sencha.gxt.chart.client.draw.sprite.Sprite;
import com.sencha.gxt.chart.client.draw.sprite.TextSprite;
import com.sencha.gxt.data.shared.LabelProvider;
import com.sencha.gxt.data.shared.ListStore;
import com.sencha.gxt.data.shared.ModelKeyProvider;
import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData;
public class DynamicBarChart extends ODBChart {
private DebugWindow dbg = DebugWindow.getInstance();
private final NumericAxis<TimeSeriesDataVO> axis = new NumericAxis<TimeSeriesDataVO>();
private final TimeAxis<TimeSeriesDataVO> timeAxis = new TimeAxis<TimeSeriesDataVO>();
final Chart<TimeSeriesDataVO> chart = new Chart<TimeSeriesDataVO>();
final ListStore<TimeSeriesDataVO> store = new ListStore<TimeSeriesDataVO>(new ModelKeyProvider<TimeSeriesDataVO>() {
public String getKey(TimeSeriesDataVO item) {
return String.valueOf(item.getKey());
}
});
public DynamicBarChart() {
}
public DynamicBarChart(int seriesCount, Integer min, Integer max, ArrayList<TimeSeriesDataVO> dataList) {
for (TimeSeriesDataVO data : dataList) {
store.add(0,data);
}
}
public void redraw() {
chart.redrawChart();
}
public Widget asWidget() {
final ListStore<BarSeries<TimeSeriesDataVO>> fieldStore = new ListStore<BarSeries<TimeSeriesDataVO>>(
new ModelKeyProvider<BarSeries<TimeSeriesDataVO>>() {
public String getKey(BarSeries<TimeSeriesDataVO> item) {
return item.getYField(0).getPath();
}
});
chart.setStore(store);
chart.setShadowChart(true);
chart.setAnimated(true);
Set<String> keys = store.get(0).keySet();
for (String k : keys) {
dbg.debug("Key=" + k);
BarSeries<TimeSeriesDataVO> series = createBar(k);
axis.addField(series.getYField(0));
chart.addSeries(series);
fieldStore.add(series);
}
axis.setPosition(Position.LEFT);
TextSprite title = new TextSprite("Number of Hits");
title.setFontSize(18);
axis.setTitleConfig(title);
axis.setDisplayGrid(true);
axis.setWidth(50);
PathSprite odd = new PathSprite();
odd.setOpacity(1);
odd.setFill(new Color("#ddd"));
odd.setStroke(new Color("#bbb"));
odd.setStrokeWidth(0.5);
axis.setGridOddConfig(odd);
chart.addAxis(axis);
timeAxis.setField(new MapTimeProvider());
dbg.debug("StartDate=" + store.get(0).getKey());
timeAxis.setStartDate(store.get(0).getKey());
dbg.debug("EndDate=" + store.get(store.size() - 1).getKey());
timeAxis.setEndDate(store.get(store.size() - 1).getKey());
timeAxis.setPosition(Position.BOTTOM);
timeAxis.setLabelProvider(new LabelProvider<Date>() {
public String getLabel(Date item) {
return DateTimeFormat.getFormat("h:m:s").format(item);
}
});
chart.addAxis(timeAxis);
Legend<TimeSeriesDataVO> legend = new Legend<TimeSeriesDataVO>();
legend.setPosition(Position.RIGHT);
legend.setItemHighlighting(true);
legend.setItemHiding(true);
chart.setLegend(legend);
chart.setLayoutData(new VerticalLayoutData(1, 1));
return chart;
}
private BarSeries<TimeSeriesDataVO> createBar(String seriesName) {
MapValueProvider valueProvider = new MapValueProvider(seriesName);
BarSeries<TimeSeriesDataVO> series = new BarSeries<TimeSeriesDataVO>();
series.setYAxisPosition(Position.LEFT);
Color color = new RGB((int) (Math.random() * 255), (int) (Math.random() * 255), (int) (Math.random() * 255));
series.setStroke(color);
series.setStrokeWidth(3);
series.setColumn(true);
//series.setShowMarkers(true);
Sprite marker = Primitives.circle(0, 0, 6);
marker.setFill(color);
//series.setMarkerConfig(marker);
series.addYField(0,valueProvider);
series.addColor(color);
// series.setLineHighlighter(new SeriesHighlighter() {
//
// public void highlight(Sprite sprite) {
// DrawFx.createStrokeWidthAnimator(sprite, 6).run(250);
// }
//
// public void unHighlight(Sprite sprite) {
// DrawFx.createStrokeWidthAnimator(sprite, 3).run(250);
// }
// });
return series;
}
@Override
public void updateChartData(DataVO data, Label errorLabel) {
TimeSeriesDataVO ts = (TimeSeriesDataVO)data;
chart.getStore().remove(0);
chart.getStore().add(ts);
timeAxis.setStartDate(chart.getStore().get(0).getKey());
timeAxis.setEndDate(chart.getStore().get(chart.getStore().size()-1).getKey());
chart.redrawChart();
}
}